ТАКСОФОННЫЕ СМАРТ-КАРТЫ
В сети МГТС установлены карточные таксофоны,
принимающие карточки по меньшей мере трех типов.
Внешне карточки разных типов можно различить по форме контактов чипа:
Первая и вторая карточки отвечают стандартам
ISO 7816-1 и ISO 7816-2 соответсвенно. Третий тип
пока мной неисследован. Карточки содержат
электрически программируемое ПЗУ емкостью 256 * 1 бит с последовательной
побитной выдачей информации и внутренним инкрементным счетчиком адреса.
Операция записи производит изменение состояния ячеек памяти "в одну
сторону", обратное изменение (стирание) интерфейсом карточки не
предусмотрено. Память можно было бы стереть ультрафиолетом, но чип закрыт
контактной панелью и специальной смолой. Можно применить для стирания чипа
жесткое излучение. Казалось бы, можно запрограммировать заново всю карточку,
однако первые 96 бит памяяти, где прошиты тип
карточки и код производителя, защищены от записи предохранителем, пережигаемым
на заводе после прошивки чипа.
По этим причинам использованную карточку нельзя
"перезарядить", чтобы она работала, как новая. Единственный способ
обмануть таксофоны - использовать электронный эмулятор карточки.
Однако карточки можно еще использовать для самодельных систем идентификации,
кодовых замков и т. п. целей.
2. Физический стандарт ISO
На
рисунке показана нумерация контактов чипа карточки
Соответствие
контактов сигналам:
Тип ISO 7816-1 |
Тип ISO 7816-2 |
|||
1 |
Vcc +5V |
1 |
Vcc +5V |
|
2 |
R/W |
2 |
Reset |
|
3 |
Clock |
3 |
Clock |
|
4 |
Reset |
4 |
- |
|
5 |
Gnd |
5 |
Gnd |
|
6 |
Vpp +21V |
6 |
- |
|
7 |
I/O |
7 |
I/O |
|
8 |
Fuse |
8 |
- |
|
Карточки
типа 2 совместимы сверху вниз с карточками типа 1. Для распознавания типа
карточки таксофон начинает работать по стандарту 2, и если вместо данных идут
только одни единицы, переходит на тип 1.
Диаграмма сигналов для карточки типа 1:
+21V
_____________
+5V
____________________________________|
|_________________ Vpp
: :
+5V
___________________:_____________:_________________ Reset
0V
________________|
: :
:
: :
+5V
____ :
____
: ______:______
0V
___| |_______:_____|
|________:______| :
|__________ Clock
: :
: :
: :
: : :
+5V
: :
: :
:
:______:______:
: _
0V
___:____:_______:_____:____:________|
: |______:__________ R/W
: :
: :
: :
: : :
+5V
: :
:_____: :________:
: : :__________
0V
XXXXXXXXXXXXXXXXX_____XXXXXX________XXXXXXXXXXXXXXXXXXXXXX__________ Out
:
: :
: :
:<-----><---->: :
:
: :
: : :10
to 10 to :
:
: :
: : :50
ms 50ms :
Reset Bit
1
Bit2
Bit 3
card
reading reading Bit2 writing to
1 reading
В
"чистом" виде ячейки памяти чипа типа -1 содержат 0, операция записи
прошивает в ячейку 1.
Диаграмма
сигналов чтения для карточки типа 2:
_____|
|_____________________________________________ Reset
:
:
: _____
: _____
_____
_____ _____
_____:_______|
|____:_| |_____|
|_____| |_____| |_ Clk
:
: :
: : :
: : :
: :
_____:_______:__________:_:_____:_____:_____:_____:_____:_____:_____:_
_____:___n___|_____0____:_|_____1_____|_____2_____|_____3_____|___4_:_
(Address)
:
:
:
:
: :
_____:
:_______:___________:___________:___________:_
_____XXXXXXXXXXXXXXXXXXXX_______|___________|___________|___________|_
Data
Bit
n
Bit 0 Bit 1
Bit2 Bit3
В
"чистом" виде ячейки памяти чипа типа -2 содержат 1, запись меняет
значение на 0.
Карточки типа 2 не требуют для записи подачи напряжения программирования +21В,
так как имеют встроенный умножитель напряжения.
Диаграмма сигналов последовательной записи для карточки типа 2:
___________|
|______________________________| |_______________ Reset
:
:
___
:
_____
___ :
_____
___|
|____:__________| |_________|
|_____:__________| |____ Clk
:
:
: :
: : :
: :
___:________:__________:_____:_________:___:_____:__________:_____:_____
n
|
n+1
| n+2 |
: n+3 |
: (Addr)
---'--------:----------'-----:---------'---:-----:----------'-----:-----
:
: :
:
:
: :
________
_:
: : ____________:
___:
: :
________XXX_XXXXXXXXXXXXXXXXXXX____________
XX___XXXXXXXXXXXXXXXXXXXXXXX I/O
n
n+1
: :
n+1
n+2
: :
:
:
: :
write
write
Диаграмма
сигналов записи со сбросом адреса в 0 для карточки типа 2:
______|
|____________________| |_________________________________
Rst
:
:
:
_______
:
_______ ___
______:___________|
|______:_____________| |______|
|______ Clk
:
: :
:
: :
: :
:
: :
:
: :
: :
<-------------------------
address n
------------------------>:<--- n+1 ------
:
: :
:
:
: :
:
: :
:
:
: :
______:
:
:______:
: :__________: _____
______XXXXXXXXXXXXXXXXXXXXX______XXXXXXXXXXXXXXXXXXXXXXX__________XX_____
I/O
: : n
: : n n+1
:
:
: :
Write
Erase
Для карточек типа 2 следует учитывать, что счетчик
адреса не сбрасывается в диапазоне адресов 0 - 7.
Теперь мы
и подошли к самому интересному месту -
назначению каждого бита, записанного на карте. Естественно,
что
на картах других городов это назначение будет другим,
но
мы, как обещали, говорим о питерских
карточках. На
карточке
используются только 16 байт. Все остальные равны
0xFF.
В процессе исследований было считано
около 300
карточек.
Примеры памяти карт
Эта карта на 50
единиц закончилась. Номер 0050415503.
Годна до
30.09.98
E9, 30, FF, 01,
F1, E2, 80, C0
00, 00, 00, 00,
00, FF, 18, EA
Эта карта на
400 единиц также пуста. Номер 0400155921.
Годна до
30.09.98
E9, 30, FF, 01,
88, A7, 9B, E8
00, 00, 00, 00,
00, FF, D9, 79
Вот карта на
1000 единиц. Осталось 998. Номер 1000013039.
Годна до
31.12.99
E9, 30, FF, 01,
F7, 3F, 59, DC
00, 01, 7F, 0F,
3F, FF, 68, 6B
Потом я
позвонил по этой карте. Осталось 6 единиц.
E9, 30, FF, 01,
F7, 3F, 59, DC
00, 00, 00, 00,
3F, FF, 68, 6B
Наконец, она
закончилась.
E9, 30, FF, 01,
F7, 3F, 59, DC
00, 00, 00, 00,
00, FF, 68, 6B
Назначение полей
1.
Первые 4 байта - какой-то идентификатор. На всех картах
E9, 30, FF, 01.
2.
Следующие 4 байта - серийный номер карты. Расположив
биты в байтах в обратном порядке, а затем и сами байты,
получим 32 разрядное целое без знака. К примеру, байты
F7, 3F, 59, DC с обратным порядком бит выглядят как EF,
FC, 9A, 3B. Получим номер карты
0x3B9AFCEF или
1000013039 в десятичном виде. Нетрудно заметить, что
номер, напечатанный на карте, всегда состоит
из 10
цифр, а первые 4 цифры - емкость карточки.
3.
Следующие 5 байт - количество единиц, оставшихся
на
карточке. Формат
хранения очень интересный:
используется количество единичных битов
в байте,
начиная с младшего. Соответственно значение байта 07
соответствует 3 единицам, значение 1F - пяти, а 7F -
семи единицам. Максимальное
количество единиц,
хранящихся в байте - семь. Соответственно используется
восьмеричная система счисления. Таким образом, байты
00, 01, 7F, 0F, 3F соответствуют 01746 в восьмеричной
системе или 998 единиц
в десятичной системе.
Максимальное количество единиц может выражаться числом
77777 в восьмеричной или 32767 в десятичной системе.
4.
Следующий байт всегда равен FF.
Похоже, он не
используется.
5.
Два последних байта, по-видимому, выражают
CRC или
другой контрольный код для первых 8 постоянных байт,
т.к. при расходовании единиц они не меняются, но
на
каждой карточке они свои. Пока их назначение не ясно.
Обнаружилось, что срок годности не записан на карте.
По
всей видимости, он как-то связан с
номером карты.
Возможно,
каждому сроку годности соответствуют определенный
диапазон
номеров.
Как уже говорилось, из 10 цифр номера
первые 4
выражают
емкость карты. Оставшиеся 6 не идентифицируют
карту
однозначно, т.к. уже выпущено более миллиона карт.
Всего
при подобной системе нумерации может существовать 6
миллионов карт:
* На 25 единиц
с номерами от 0025000000 до 0025999999
* На 50 единиц
с номерами от 0050000000 до 0050999999
* На 100 единиц
с номерами от 0100000000 до 0100999999
* На 200 единиц
с номерами от 0200000000 до 0200999999
* На 400 единиц
с номерами от 0400000000 до 0400999999
* На 1000
единиц с номерами от 1000000000 до 1000999999
(С) Alien AKA Dimik
(dimik@infopro.spb.su)
В принципе карточки МГТС организованы подобным же
образом, единственное отличие состоит в разных кодах идентификации карточки, ессно, они для каждой зоны разные
Принципиальная схема читалки, подключаемой в
параллельный порт РС:
Схему можно упростить, исключив транзисторы и
прочие детали, относящиеся к отработке записи карточек типа 1 (запись карточек
типа 2 все равно будет работать).
1. Аппаратная часть - разъем портаСоединительная розетка порта имеет следующий вид и
расположение контактов:
Назначение
контактов (специфика работы с принтером) следующее:
1
STROBE - Строб
(НИЗКИЙ означает что можно читать данные)
2 DATA 1 - линия данных 1
3 DATA 2 - " 2
4 DATA 3 - " 3
5 DATA 4 - " 4
6
DATA 5 - " 5
7
DATA 6 - " 6
8
DATA 7 - " 7
9
DATA 8 - " 8
10
ACKNLG - Принято
(НИЗКИЙ показывает что данные считаны устройством)
11 BUSY - Занято (ВЫСКОЙ в следующих
случаях:
(a) прием данных
(b) печать
(c) принтер офф-лайн
(d) ошибка
принтера)
12
PE - Нет
бумаги (ВЫСОКИЙ если в принтере не бумаги)
13
SLCT - Выбор
(ВЫСОКИЙ если принтер выбран)
14
AUTO FEED XT -
Авто-перевод строки (НИЗКИЙ показывает принтер будет автоматически переводить
строку
после знака
"возврат каретки". Зависит от установки DIP переключателей принтера.
15 n.c.
16
0V - Логичексая земля
17
CHASSIS GND - Шасси
(земля)
18 n.c.
19-30 GND - Сигнальная земля (оплетки
жил от контактов 1-12)
31
INIT -
Инициализация (НИЗКИЙ импульс для сброса принтера)
32
ERROR - Ошибка
(НИЗКИЙ если:
(a)
кончилась бумага
(b) устройство офф-лайн
(c) состояние ошибки)
33
GND -
Сигнальная земля
34 n.c.
35
LOGIC 1 -
Логический ВЫСОКИЙ (обычно от источника +5 В через 3.3 кОм)
36
SLCT IN -
Разрешение ввода (данные вводятся в принтер только если на линии НИЗКИЙ,
однако зависит
от установки DIP переключателей)
Как видно из этой таблицы, порт имеет достаточное количество
входных и выходных линий, что позволяет подключать множество самых
разнообразных устройств, требующих управления от компьютера. Нагрузочная
способность выходов в нормальном режиме не более 1 мА, максимум 5 мА и зависит
от чипа, на котором реализован интерфейс. Наибольшую нагрузку допускают порты,
реализованные в виде отдельной мультикарты,
наименьшую - интергрированный в одном чипе контроллер
периферии, встроенный в материнскую плату. Для экспериментальной работы лучше
использовать отдельные MIO карты, так как при случайных повреждениях страдает
дешевая карта, в то время как при повреждении интегрированного контроллера в
негодность приходит вся материнская плата.
Порт
можно использовать и для питания подсоединенных устройств и позволяет обойтись
без внешнего источника питания в случае, если потребляемый ток не превышает 10
мА (КМОП-схемы). Для этого через диоды объединяют
неиспользуемые выходы шиной (аноды к выходам, катоды на шину), последовательно
устанавливают резистор сопротивлением не менее 100 оМ
(для защиты от перегрузки выходов при случайном коротком замыкании), и
параллельно на землю - конденсатор емкостью не менее 10 мкФ, для сглаживания
пульсаций питающего тока. Так как микросхемы КМОП потребляют ток только в
момент переключения, напряжение на конденсаторе будет примерно равно напряжению
логической единицы, т.е. не менее 3.6 вольта, что вполне достаточно для питания
большинства микросхем.
Для
питнаия более мощных устройств использется
питание от клавиатуры (через отводной разъем-переходник) или от внешнего
источника.
Внимание!
При питании от сети надо соединить устройство с разъемом порта, и только потом
включить штепсель блока питания в сеть, иначе из-за разницы земляных
потенциалов в момент соединения разьема порта
какие-либо входы/выходы могут оказаться соединенными раньше, чем вывод земли, и
окажутся под потенциалом до 127 вольт, что приведет к выходу из строя чипа
порта и/или деталей устройства.
Перед расстыковкой разъема сначала отключают штепсель сети.
Порт
можно использовать для превращения компьютера в мощный контроллер, для
управления чипами, программирования ПЗУ, в качестве светомузыки, и т. п. В
случае, если требуется посдоединять не-ТТЛ оборудование или управлять цепями с повышенной нагрузкой/напряжением,
используйте стандартные ТТЛ-развязки и адаптеры. Ключ
+22 В показан на схеме читалки в статье ТАКСОФОННЫЕ СМАРТ-КАРТЫ. Для управления
сетевыми устройствами рекомендуется использовать гальванически развязанный
через оптрон адаптер, гарантирующий полную безопасность:
Номиналы
указаны для оптрона с индексом Б. Для оптрона с индексом А номинал входного
резистора надо уменьшить с 470 Ом до 330 Ом, а резистор базы с 82 кОм до 15 кОм.
2. Доступ и управление портом
Компьютер
IBM может управлять тремя параллельными портами LPT1-LPT3. Базовый адрес LPT1
находится в ячейке BIOS 0040:0008 (слово), LPT2 - 0040:000A и т. д. Какой
адаптер назначен какому LPT не определено и зависит от конфигурации компьютера
и ОС, поэтому программа должна определить используемые ими адреса. При
инициализации базовому адресу присваивается 0, если адаптер не установлен.
Адаптер |
Регистр |
Регистр |
Регистр |
LPT1 |
378h |
379h |
37Ah |
LPT2 |
278h |
279h |
27Ah |
Регистр
выходных данных - тот адрес порта, через который проходит каждый байт данных,
посылаемый в порт. Регистр статуса сообщает различную информацию о входных
линиях; процессор может постоянно опрашивать его, чтобы распознать момент,
когда все в порядке и можно посылать данные. Регистр статуса сообщает также,
что произошла ошибка (линия ERROR). Регистр управления инициализирует адаптер и
управляет выводом данных. Он может также подготавливать параллельный порт для
операций преры- вания, с тем
чтобы устройство посылало прерывание к процессору, когда оно готово к приему
очередной порции данных, оставляя процессор свободным для других дел. Ниже
перечислены значения битов регистров статуса и управления:
Регистр управления |
||
бит 0 |
0 = нормальная установка |
1 = вызывает вывод байта данных |
бит 1 |
0 = нормальная установка |
1 = автоматический перевод строки после |
бит 2 |
0 = инициализировать порт принтера |
1 = нормальная установка |
бит 3 |
0 = отмена выбора принтера |
1 = нормальная установка |
бит 4 |
0 = прерывание принтера запрещено |
1 = разрешено |
бит 5-7 |
не используются |
Регистр статуса |
||
бит 0-2 |
не используются |
|
бит 3 |
0 = ошибка принтера |
1 = нет ошибки |
бит 4 |
0 = принтер off-line |
1 = принтер on-line |
бит 5 |
0 = бумага вставлена |
1 = нет бумаги |
бит 6 |
0 = принтер подтверждает прием символа |
1= нормальная установки |
бит 7 |
0 = принтер занят |
1 = принтер свободен |
Из
этих таблиц видно, как соотностятся входные линии
порта и биты регистров управления и статуса.
Мы
можем управлять отдельно каждой выходной линией порта, послыая
соответствующий байт в базовый регистр, и знать состояние каждой входной линии,
читая из регистров статуса/управления. Для получения базового адреса порта
прочитаем его из BIOS:
(ASM):
MOV AX,0040h
MOV ES,AX ; записали сегмент BIOS в
ES
MOV DX,ES:[8] ; прочитали базовый адрес
MOV LPT_BASE, DX ; и запомнили
INC DX
MOV LPT1_CONTROL,DX ; добавили 1 и получили рег. управления
INC DX
MOV LPT1_STATUS,DX ; добавили еще 1 и получили рег. статуса
...
MOV AL,... ; что-то занесли в AL
OUT DX,AL ; и записали в порт
статуса
(BASIC):
Def Seg
= &h40 ' установили
сегмент BIOS
LPT1Base = Peek (9) + &hFF * Peek (8)
LPT1Control = LPTBase + 1
LPT1Status = LPTBase + 2
...
OUT LPT1Base, MyByte ' вывод данных в порт
...
Status = INP (LPTControl) ' чтение регистра управления
Если
нам необходимо изменить состояние только одного из битов регистра, сначала надо
прочитать из него значение и с произвести с ним логическиую
операцию OR или AND с маской, где выставлен изменяемый бит, в зависимости от
того, хотим мы установить или сбросить этот бит.
Например, требуется установить ВЫСОКИЙ уровень на линии SLCT IN (выбор
принтера). Из таблиц видим, что этой линией управляет бит 3 регистра
управления. Проделаем следующее:
-
прочитаем из этого регистра
- с прочитанным значением делаем операцию OR с маской 00001000b, при этом все
немаскированные биты (значение 0 в маске), сохранят свое прежнее значение, а
бит 3 станет единцей.
- запишем полученное в регистр
Для
сброса этой линии в НИЗКИЙ уровень делаем так:
-
прочитаем из этого регистра
- с прочитанным значением делаем операцию AND с маской 11110111b, при этом все
маскированные биты (значение 1 в маске), сохранят свое прежнее значение, а бит
3 станет нулем.
- запишем полученное в регистр
Рассмотрим
фрагмент кода для таких операций:
(ASM):
; установим ВЫСОКИЙ уровень
MOV DX,LPT1_CONTROL ; загрузили адрес регистра в DX
MOV AH, 00001000b ; маску - в AH
IN AL,DX ; прочитали регистр
OR AL,AH ; отмаскировали
OUT DX,AL ; записали обратно
...
; установим НИЗКИЙ
MOV DX,LPT1_CONTROL ; загрузили адрес регистра в DX
MOV AH, 11110111b ; маску - в AH (для циклического
изменения используем NOT)
IN AL,DX ; прочитали регистр
AND AL,AH ; отмаскировали
OUT DX,AL ; записали обратно
...
(BASIC):
...
' установка ВЫСОКОГО уровня
Mask=8 ' 00001000b
Value = INP (LPT1Control)
Value = Value OR Mask
OUT LPT1Control, Value
...
' установка НИЗКОГО уровня
Mask=247 ' 11110111b
Value = INP (LPT1Control)
Value = Value AND Mask
OUT LPT1Control, Value
...
В
статье ТАКСОФОННЫЕ
СМАРТ-КАРТЫ описана читалка карточек, подсоединяемая к LPT. Ниже
помещен текст программы, использовавшейся для отладки читалки, написанный на
языке Basic, которую можно запускать под
интерпретатором, входящим в поставку МС-ДОС. Подпрограмма writecard()
пишет 0 или 1 во все адреса карточки.
' ---
' --- PayPHONE
CARDS ---
' ---
DECLARE SUB writecard ()
DECLARE FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS
STRING)
DECLARE SUB shortdelay ()
DECLARE SUB delay (value AS INTEGER)
DECLARE SUB readcard ()
DECLARE SUB cardreset ()
' using LPT#1 port
CONST lptbase = &H378
CONST lptstatus = lptbase + 1
CONST lptctrl = lptbase + 2
DIM SHARED cardtype
' --------------------------
' PinOut Connection:
' --------------------------
' Wire Signal
Reader
' --------------------------
' 2 D0
Reset
' 3 D1
Clock
' 4 D2
R/W
' 11 BUSY
I/O
' 25 GND
GND
' --------------------------
start:
CLS ' clear screen
PRINT "Select casd type ISO1 - [1]
or ISO2 - [2]:"
locr0: ' loop cicle waiting when
user press a key
a$ = UCASE$(INKEY$)
IF a$ = "1" THEN cardtype = 1: GOTO locr1
IF a$ = "2" THEN cardtype = 2: GOTO locr1
GOTO locr0
locr1:
PRINT "Insert a card and press [R] for Reading; [W] for
Writing."
loc0: ' loop cicle waiting when
user press a key
a$ = INKEY$
a$ = UCASE$(a$) ' this function
make upper-case char
IF a$ = "R" THEN GOTO reading
IF a$ = "W" THEN GOTO writing
GOTO loc0
reading:
OUT lptctrl, datanorm '
port initialization
CLS ' clear screen
PRINT "Resetting card. Please wait..."
cardreset
CLS
PRINT "Reading card:"
PRINT
PRINT " byte number bit number value descrtption"
PRINT " Dec Hex 7 6 5 4 : 3 2 1 0 Dec Hex
(optional)"
PRINT "--8<------------ | | | |
| | | | --------------------------"
readcard
PRINT
"--8<---------------------------------------------------------"
PRINT
PRINT "[N] for new card or [Q] for quit"
loc1: ' loop cicle waiting when
user press a key
a$ = INKEY$
a$ = UCASE$(a$)
IF a$ = "N" THEN GOTO start
IF a$ = "Q" THEN END
GOTO loc1
writing:
CLS
PRINT "Resetting card..."
cardreset
CLS
PRINT "Writing card"
LOCATE 2, 2: PRINT STRING$(32, "ё")
writecard
PRINT "Now test reading card. Press a key"
SLEEP ' wait for user
press a key
GOTO reading
tr1:
PRINT "Ops! An error "; ERR; " occured."
END
' ------------------------------
' SubRoutines & Functions
' ------------------------------
SUB cardreset
IF cardtype = 2 THEN
OUT lptbase, &H4 ' CLK & RESET DOWN
delay 1
OUT lptbase, &H6 ' CLK UP
delay 1
OUT lptbase, &H4 ' CLK DOWN
delay 1
OUT lptbase, &H0 ' RESET UP - to normal position
delay 1
ELSE
OUT lptbase, &H0 ' CLK & RESET DOWN
delay 1
OUT lptbase, &H2 ' CLK UP
delay 1
OUT lptbase, &H0 ' CLK DOWN
delay 1
OUT lptbase, &H1 ' RESET UP - to normal position
delay 1
END IF
END SUB
' ---------------------------
SUB delay (value AS INTEGER)
DIM t AS SINGLE
t = TIMER + value / 100
WHILE t > TIMER: WEND
END SUB
' ---------------------------
FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS STRING)
IF arg THEN iif$ = truepath ELSE
iif$ = falsepath
END FUNCTION
' ---------------------------
SUB readcard
DIM i AS INTEGER
DIM j AS INTEGER
DIM bit AS INTEGER
DIM value AS INTEGER
DIM french AS INTEGER
CONST true = -1, false = 0
FOR i = 1 TO 32
' right align the columns
IF i < 10 THEN
PRINT "Byte " +
STR$(i) + " (0x" + iif(LEN(HEX$(i)) = 2, HEX$(i), "0" +
HEX$(i)) + ") ";
ELSE
PRINT "Byte" +
STR$(i) + " (0x" + iif(LEN(HEX$(i)) = 2, HEX$(i), "0" +
HEX$(i)) + ") ";
END IF
' start to reading new byte
FOR j = 1 TO 8
' after chip has reseted
' we already have bit #1
' on I/O pin, then get
it:
bit = -NOT
(-(INP(lptstatus) AND &H80) \ &H80)
PRINT STR$(bit);
IF j = 4 THEN PRINT
" :";
value = value + (2 ^ (8 -
j) * bit)
IF cardtype = 2 THEN
OUT lptbase,
&H0 ' drop CLK, RESET still
raised
shortdelay
OUT lptbase,
&H2 ' raise CLK
shortdelay
OUT lptbase,
&H0 ' drop CLK
shortdelay
ELSE
OUT lptbase, &H1
shortdelay
OUT lptbase,
&H3 ' raise CLK
shortdelay
OUT lptbase,
&H1 ' drop CLK
shortdelay
END IF
' now card have a next
bit
NEXT j
PRINT " " + STR$(value);
PRINT SPACE$(5 -
LEN(STR$(value)));
PRINT "(0x" +
HEX$(value) + ") ";
' check what screen filled and
scrollup after key press
IF i= 16 THEN
PRINT
PRINT "Press a key to
continue...";
SLEEP
END IF
PRINT
value = 0
NEXT i
END SUB
' ---------------------------
SUB shortdelay
FOR t = 0 TO 1000: NEXT
END SUB
' ---------------------------
SUB writecard
OUT lptbase, 0
delay 5
zero = -1 ' (pisat nuli ili
edinici)
FOR i = 1 TO 256
IF zero THEN
OUT lptbase, 4
shortdelay
OUT lptbase, 0
shortdelay
OUT lptbase, 2
shortdelay
OUT lptbase, 0
shortdelay
OUT lptbase, 2
shortdelay
OUT lptbase, 0
shortdelay
ELSE
OUT lptbase, 4
delay 1
OUT lptbase, 0
delay 1
OUT lptbase, 2
delay 1
OUT lptbase, 0
delay 1
OUT lptbase, 4
delay 1
OUT lptbase, 0
delay 1
OUT lptbase, 2
delay 1
OUT lptbase,
0
delay
1
OUT lptbase, 2
delay 1
OUT lptbase, 0
delay 1
END IF
LOCATE 2, 2: PRINT
STRING$(i / 8, "_")
NEXT i
END SUB
Прграмма не является законченным средством для обработки
карточек и служит для ознакомительных целей, иллюстрируя работу с портом и
подсоединенным устройством.
Устройство для
чтения/записи магнитных карточек.
Конструкция и принципиальная схема.
Для изготовления устройства, которое,
разумеется, можно применять не только для чтения, но и записи магнитных
карточек, удобно использовать готовый лентопротяжный механизм магнитофона или плейера. Карточка при этом протягивается так же как и
лента, между тонвалом и тонроликом.
Но надо иметь в виду - металлический тонвал
проскальзывает по пластиковой поверхности телефонной карточки. Автор одел на тонвал тонкую ПВХ трубочку от изоляции импортного
экранированного провода, предварительно окунув ее в ацетон. После высыхания
ацетона можно включить моторчик ЛПМ и подшлифовать
внешнюю поверхность трубки мелкой наждачкой.
Подготовка приводного вала - очень важный момент! Именно от вала в основном
зависит равномерность скорости подачи карточки. Впрочем, остальные узлы тоже
требуют аккуратности. Несмотря на это устройство полностью можно изготовить за
пару выходных дней.
После подготовки вала необходимо
изготовить направляющий тракт. Его конструкция зависит от конкретного ЛПМ,
поэтому здесь приводится только эскиз, иллюстрирующий идею. В качестве
исходного материала был использован двухсторонний фольгированный
стеклотекстолит. Его легко обрабатывать и соединять детали пайкой, без
дополнительных крепежных деталей. В конструкции используется пара
светодиод-фотодиод для регистрации моментов начала и окончания прохождения
карточки через ЛПМ. Необходимо учитывать, что запись начинается примерно в 3мм
от края карточки и располагать головку так, чтобы тонвал
успел захватить и начать протаскивать карточку до того, как начало записи
окажется в рабочей зоне головки. Примерно в этот же момент должен срабатывать и
оптодатчик. У меня карточка после прохождения ЛПМ по
инерции проскакивает дальше и открывает оптодатчик
снова. Но лучше поставить второй оптодатчик на
окончание карточки, чуть правее оси магнитного зазора головки.
Рис.1. Эскиз устройства для чтения магнитных карточек.
1- направляющие желобки из жести; 2- светодиод; 3- фотодиод; 4- неподвижная
пластина узла головки; 5- подвижная пластина узла головки; 6- основание; 7-
контактная плата; 8- магнитная карточка; 9- тонролик;
10- тонвал.
Эскиз устройства приведен на рисунке 1.
Особую сложность представляет только узел крепления головки, так как надо
прижимать головку к карточке, а не наоборот. Площадка с прикрепленной к ней
головкой равномерно прижимается четырьмя пружинками. Прижимное усилие должно
быть небольшим, т.к. магнитный слой намагничен очень сильно. Сохранена возможность
регулировки азимута головки. Провода, идущие от головки - тонкие
неэкранированные, не должны мешать смещению площадки с головкой. Они подведены
к контактным площадкам недалеко от головки. Далее идут экранированные провода.
Моторчик питается непосредственно от 5-вольтового напряжения питания всей
схемы. Моторчик от плеера обеспечивает при этом необходимую скорость движения
карточки. Помехи легко шунтируются керамическим конденсатором, расположенным на
выводах моторчика.
Принципиальная схема приведена на рисунке 2. За основу взята схема
"читалки" от Spectrum-совместимого компьютера "Ленинград".
Добавлен только входной каскад на одном транзисторе. При исправных деталях
схема не требует наладки, собрана у автора на макетной плате. Обратите особое
внимание на тщательное экранирование узлов и соединений. Схемка
с ключевым транзистором для оптодатчика не показана в
силу своей примитивности.
Simple PC smartcard reader
This simple PC Smartcard reader was
shown in Electronics Design magazine February 17, 1997 issue on page 172 in the
ideas for design secation. The circuit is designed by Jose Carlos Cossio and is
based on simple smartcard reader design shown on the same magasine July 8,
1996.
This circuit takes all smartcard
operating power form PC parallel port. The basic circuit idea is quites imilar
to thw simple smartcard reader shown in What you need to know about
electronics telecards
written by Stephane Bausson. There are some minor differences,
which means that all the same software can't ne used.
PC
Parallel
port
25 o---------------------------------------------------------------+
GND
|
ISO layout |
|
/---------+--------\
|
+------|
VCC | GND |--------------+
D2 | |------\
| /-----+ |
4 o----------------------)------|
R/W \ | / Vpp |--------+ |
D1 | +--------( )-------+ |
|
3 o----------------------)------|
CLK / | \ I/O |----+
| |
D0 | +------/
| \-----+ |
| |
2 o----------------------)------|
RST | Fuse |
| | |
| \---------+--------/ |
| |
Busy | | |
|
11 o----------------------)------------------------------+ |
|
| | |
+----------------------------------+
|
D3 |\ | | |
5 o-----------|
>+-------+ |
|/ | | || |
+------------||--------------------------+
D4 |\ | | ||
6 o-----------| >+-------+
|/ | | 100 nF
|
D5 |\ | |
7 o-----------| >+-------+
|/ | |
|
D6 |\ | |
8 o-----------| >+-------+
|/ | |
|
D7 |\ | |
9 o-----------| >+-------'
|/ |
5 X 1N4148
В
качестве примера рассмотрим таксофонную магнитную карту Urmet
Patent. Таксофоны, использующие эти карты, имеются, в
частности, во многих городах России. Карта представляет собой прямоугольник из
упругого тонкого пластика, на который с одной стороны наносится полоска
магнитного материала (на рисунке черная), с другой стороны - рекламная
картинка. Левый верхний угол отрывной. Он играет роль пломбы, подтверждающей,
что до вас этой картой никто не пользовался. Перед началом эксплуатации его
удаляют.
В этой статье мы рассмотрим, как
самостоятельно изготовить такую карту с применением немного необычной
технологии. Пока не будем касаться вопроса схемотехники
и конструкции устройства для чтения-записи информации, поговорим о самой
карточке. Считывание магнитной записи с карточки имеет свои особенности. В
обычном магнитофоне лента плотно прижимается к головке специальной
подпружиненной подушечкой и, к тому же, немного огибает головку. Это удается
сделать, потому что лента очень тонкая и мягкая. С карточкой так не получится.
Из-за того, что карточка жесткая и ее материал имеет некоторые остаточные
неровности, не удается обеспечить идеальное прилегание считывающей головки к
магнитному носителю. При сильном прижиме головки к карточке может возникнуть ее
притормаживание в подающем тракте и возникнет сильный
износ головки и носителя самой карточки. Поэтому реально головка практически не
касается дорожки на карточке, находясь на микронном расстоянии от нее. Применяются
либо обычные индукционные головки, либо полупроводниковые магниточувствительные
приборы.Карточку обычно носят в кошельке или
кармане, где ее магнитный слой может поцарапаться, но необходимо гарантировать
клиенту устойчивое считывание карточки даже при наличии микродефектов. Все эти
проблемы на практике решают, применяя достаточно толстый слой магнитного
носителя, имеющего высокую коэрцитивность
(способность к намагничиванию).
Для изготовления самодельной
карточки нам понадобятся:
Способ изготовления во многом ясен из рисунка. Почему нельзя просто приклеить
полоску магнитного носителя, вырезанную из материала дискеты на кусок картона?
Потому, что крайне сложно нанести быстросохнущий клей очень тонким ровным слоем
и аккуратно приклеить магнитную полоску так, чтобы клей не выступал из-под ее
краев.
Итак, сначала делаем заготовку, по размеру близкую к карточке, но чуть больше.
Берем тонкий картон, по толщине примерно как маленький календарик.
Но необходимо, чтобы у него была только одна глянцевая сторона, поэтому календарик не подойдет - ПВА плохо прилипнет. Берем
импортную самоклеящуюся бумагу с отрывной основой. Такую цветную бумагу можно
купить в магазине канцтоваров. Аккуратно смазываем клеем ПВА шершавую сторону
картона и бумагу. Не испачкайте обратную сторону картона. Складываем намазанные
слои, кладем заготовку на плотную ровную поверхность и через газетку
проглаживаем утюгом. Утюг включаем на "шелк" или чуть горячее. Кто
делал "дембельский альбом", уже
натренирован в таком методе склеивания. Гладим с двух сторон. Через несколько
минут бутерброд будет готов. Если его сильно коробит после остывания, и не
удается отгладить, значит картон не подходит. Попробуйте другой картон, можно
вообще без глянца. Разберите дискету, вырежьте из нее полоску, равную по ширине
заводской, но чуть длиннее. Из бумажной заготовки по образцу вырежьте саму
карточку. Отслоите защитный слой от самоклеящейся бумаги и аккуратно приклейте
в нужное место магнитную полоску. Перед этим вымойте руки и вообще будьте очень
аккуратны. Малейшая соринка, попавшая под магнитную полоску, погубит вашу
работу. Оторватьполоску обратно вы уже не сможете.
Возьмите тонкую писчую бумагу и подклейте встык к краям магнитной
полоски. Подберите бумагу по толщине магнитной ленты. Не используйте кальку и
подобную ей вощеную бумагу. Она может отклеиться от основы. Обрежьте излишки
бумаги по краям. Бритвенным лезвием срежьте излишки магнитной полоски, сняв
небольшую фасочку по краям. Удалите, при
необходимости, заусенцы по краям карточки. Болванка для последующей записи
готова. Метод не так сложен, как это может показаться, и позволяет делать
болванки чуть ли не партиями.
1. Особенности магнитной записи
Принцип
магнитной записи ничем не отличается от принятого в звукозаписи. Для его
реализации подходит звуковая аппаратура. Стирание можно делать постоянным
магнитом с пластиной - концентратором магнитного потока. Хотя при таком
стирании велик уровень шумов, для цифрового считывания это не важно. Запись
производят без подмагничивания постояныым или ВЧ
током, так даже достигаются более резкие переходы намагниченности носителя. Для
изготовления магнитной полоски самодельных карточек подойдет старая 5 "
дискета на 360 Кб, имеющая слой с низкой коэрцитивностью.
Кодирование данных осуществляется общепринятым методом "без возврата к
нулю", который исключает длинные участки постоянной намагниченности, что
облегчает синхроннизацию при считывании.
Усиленный
выходной сигнал с читающей головки проходит двухпороговый
компаратор, формирующий ВЫСОКИЙ и НИЗКИЙ логичекие
уровни. Цифровые данные поступают на стандартный последовательный интерфейс
(типа RS-232), передающий данные на обработку компьютеру.
На
рисунке видно, что если в момент синхро-отсчета
уровень сигнала НЕ меняется, то он считается равным НУЛЮ, а если сигнал имеет
перепад, то ЕДИНИЦЕ.
Форматы кодирования данных
** Формат данных
ANSI/ISO BCD **
Этот вариант кодирования имеет длину слова в 5 бит. Первые четыре бита -
данные, a 5-й - бит четности. Cумма
всех пяти битов должна давать НЕчетное число. Младший
бит b1 считывается первым в серии.
b1 |
b2 |
b3 |
b4 |
b5 |
Символ |
Значение |
0 |
0 |
0 |
0 |
1 |
0 (0H) |
Цифра |
1 |
0 |
0 |
0 |
0 |
1 (1H) |
" |
0 |
1 |
0 |
0 |
0 |
2 (2H) |
" |
1 |
1 |
0 |
0 |
1 |
3 (3H) |
" |
0 |
0 |
1 |
0 |
0 |
4 (4H) |
" |
1 |
0 |
1 |
0 |
1 |
5 (5H) |
" |
0 |
1 |
1 |
0 |
1 |
6 (6H) |
" |
1 |
1 |
1 |
0 |
0 |
7 (7H) |
" |
0 |
0 |
0 |
1 |
0 |
8 (8H) |
" |
1 |
0 |
0 |
1 |
1 |
9 (9H) |
" |
0 |
1 |
0 |
1 |
1 |
: (AH) |
Управление |
1 |
1 |
0 |
1 |
0 |
; (BH) |
Начало
последовательности |
0 |
0 |
1 |
1 |
1 |
< (CH) |
Управление |
1 |
0 |
1 |
1 |
0 |
= (DH) |
Разделитель полей |
0 |
1 |
1 |
1 |
0 |
> (EH) |
Управление |
1 |
1 |
1 |
1 |
1 |
? (FH) |
Конец
последовательности |
** Формат данных
ANSI/ISO буквенный**
Этот
формат (буквенно-цифровой) содержит определения 64 символов, при 7-битном
кодировании, 6 значащих битах, и седьмом бите четности, как и в предыдущем
формате. Младший бит b1 считывается первым.
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
b7 |
Символ |
Значение |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
space
(0H) |
Специальный |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
! (1H) |
" |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
" (2H) |
" |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
# (3H) |
" |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
$ (4H) |
" |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
% (5H) |
Начало
последовательности |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
& (6H) |
Специальный |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
' (7H) |
" |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
( (8H) |
" |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
) (9H) |
" |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
* (AH) |
" |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
+ (BH) |
" |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
, (CH) |
" |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
- (DH) |
" |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
. (EH) |
" |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
/ (FH) |
" |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 (10H) |
Данные (цифры) |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 (11H) |
" |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
2 (12H) |
" |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
3 (13H) |
" |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
4 (14H) |
" |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
5 (15H) |
" |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
6 (16H) |
" |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
7 (17H) |
" |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
8 (18H) |
" |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
9 (19H) |
" |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
: (1AH) |
Специальный |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
; (1BH) |
" |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
< (1CH) |
" |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
= (1DH) |
" |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
> (1EH) |
" |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
? (1FH) |
Конец пос-ти |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
@ (20H) |
Специальный |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
A (21H) |
Данные (буквы) |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
B (22H) |
" |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
C (23H) |
" |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
D (24H) |
" |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
E (25H) |
" |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
F (26H) |
" |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
G (27H) |
" |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
H (28H) |
" |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
I (29H) |
" |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
J (2AH) |
" |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
K (2BH) |
" |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
L (2CH) |
" |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
M (2DH) |
" |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
N (2EH) |
" |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
O (2FH) |
" |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
P (30H) |
" |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
Q (31H) |
" |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
R (32H) |
" |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
S (33H) |
" |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
T (34H) |
" |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
U (35H) |
" |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
V (36H) |
" |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
W (37H) |
" |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
X (38H) |
" |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
Y (39H) |
" |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
Z (3AH) |
" |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
[ (3BH) |
Специальный |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
\ (3DH) |
Специальный |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
] (3EH) |
Специальный |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
^ (3FH) |
Разделитель полей |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
_ (40H) |
Специальный |
Форматы записи дорожек
Запись
на дорожке начинается с серии нулей (сигналов "НИЗКОГО" уровня, а не
символов), число которых бывает разным, но не менне
шестнадцати. Этот форвард служит для синхронизации такта считывателя. Далее
записывается информация в формате, в зависимости от номера дорожки, как
показывает таблица:
Дорожка ј1 |
НП |
КФ |
НПС |
Имя |
РП |
Доп. данные |
КП |
LRC |
Дорожка ј2 |
НП |
НПС |
РП |
Доп. данные |
КП |
LRC |
Дорожка ј3 |
подобно дорожкам 1 и 2. В большинстве случаев не
используется. |
НП |
Начало Последовательности |
КФ |
Код Формата |
НПС |
Номер Первичного Cчета (19 цифр
макс) |
РП |
Разделитель Полей |
Имя |
(макс. 26 знаков) |
Доп. данные |
дата истечения, код шифра и т. п. |
КП |
Конец Последовательности |
LRC |
Код контроля четности |
Формат
кодирования по разным дорожкам и плотность записи различна и соответствует
таблице:
Дорожка |
Плотность |
Формат |
Кол-во |
1 |
210 bpi |
букв-цифр |
79 |
2 |
75 bpi |
BCD |
40 |
3 |
210 bpi |
BCD |
107 |
Кодирование
управляющих символов в соответствии со стандартом каждой дорожки.
Завершает запись дорожки такая же, как в начале, последовательность нулей.
Примеры записанного на карточках
Номер
на лицевой стороне карточки: 1111 2222 3333 4444
Срок действия до: 12 / 99
-=Mastercard=-
Track 2 (BCD, 75 bpi)-> ;1111222233334444=99121010000000000000?
Ttrack 1 (ALPHA, 210 bpi)-> %B1111222233334444^PUBLIC/JOHN?
* примеч.: "101"
встречается на большинстве провереных карточек, также
как и "В".
-=VISA=-
T2 (BCD,75 bpi)-> ;1111222233334444=9912101xxxxxxxxxxxxx?
T1 (ALPHA,210 bpi)-> %B1111222233334444^PUBLIC/JOHN^9912101xxxxxxxxxxxxx?
* примеч.: 101 и В см выше.
Также, ххх разные от карте к карте, и могут означать закодировванный номер
счета, в любом случае, я нашел 13 цифр номера
счета.
-=Discover=-
T2 (BCD,75 bpi)-> ;1111222233334444=991210100000?
T1 (ALPHA,210 bpi)-> %B1111222233334444^PUBLIC/JOHN___^991210100000?
* примеч.:
"10100000" и "B" и иногда встречается
"10110000".Подчерки после имени JOHN означают, что имя
дополняется до 26 символов ПРОБЕЛАМИ.
-=US Sprint FON=- Номер карточки -> 111 222 3333 4444
Track 2 (BCD,75 bpi)-> ;xxxxxx11122233339==xxx4444xxxxxxxxxx=?
Track 1 (ALPHA,210 bpi)-> %B^ /^^xxxxxxxxxxxxxxxxx?
* такое впечатление, что 1
дорожка не используется.
-=Fleet
Bank=-
Номер карточки -> 111111 222 3333333
T2->
;1111112223333333=9912120100000000xxxx?
T1-> %B1111112223333333^PUBLIC/JOHN___^9912120100000000000000xxxx000000?
* данные "xxxх" варьируют. это закодированое
PIN смещение. Всегда 4
цифры (хммм...). "1201" всегда одни и те-же... Даже в карточках из разных банков.